package utility;

import java.util.HashMap;
import java.util.HashMap.*;
import java.util.Map;
import java.util.Random;
import java.util.Set;

public class bankCard {

	public final static Map<String, String> mapBankBIN = new HashMap<String, String>();
    public final static Map<String, String> mapBankArea = new HashMap<String, String>();
    static{
        mapBankBIN.put("农业银行.金穗校园卡(银联卡)","622821");
        mapBankBIN.put("农业银行.金穗星座卡(银联卡)","622822");
        mapBankBIN.put("农业银行.金穗通宝卡","622846");
        mapBankArea.put("江苏徐州", "273");
        mapBankArea.put("吉林长春", "053");
        mapBankArea.put("黑龙江哈尔滨", "017");
        mapBankArea.put("广东省珠海市", "011");
        mapBankArea.put("北京", "001");
        mapBankArea.put("河北秦皇岛", "064");
        mapBankArea.put("内蒙古赤峰", "189");
        mapBankArea.put("上海", "003");
        mapBankArea.put("辽宁本溪", "101");
        mapBankArea.put("安徽合肥", "066");
        mapBankArea.put("福建莆田", "069");
        mapBankArea.put("四川攀枝花", "244");
        mapBankArea.put("江西九江", "093");
    }

    
    
    /*
     * 获取银行卡Bean
     * 
     * */
    
    public BankCardBean getBankCardBean() {
    	
    	BankCardBean bankCard= new BankCardBean();
    	String bankBinName=getKey(mapBankBIN);
    	String bankAddressName=getKey(mapBankArea);
    	bankCard.setBankAddress(mapBankArea.get(bankAddressName));
    	bankCard.setBankAddressName(bankAddressName);
    	bankCard.setBankBin(mapBankBIN.get(bankBinName));
    	bankCard.setBankBinName(bankBinName);
    	bankCard.setEightRandomNumber(CreateRandomNumber());
        return bankCard;
    }

    
    
    /*
    * 随机获取map中的key值
    *
    * */
    
    public String getKey(Map<String, String> map){
    	
    	Set<String> mapBankBINSets=map.keySet();
        int index=new Random().nextInt(mapBankBINSets.size());
        int i = 0;
        for (String e : mapBankBINSets) {
            if(i==index){
            	System.out.println(e);
                return e;
                
                
            }
            i++;
        }
    	return null;
    }

    /**
     * 随机生成农业银行的卡号中间8位+倒数第二位
     * 倒数第二位普卡是1，芯片卡是6，最新出的闪付卡是7
     */
    public static String CreateRandomNumber() {
        
        String no = (int) Math.round(Math.random() * 89999999 + 10000000)+"6";
        return no;
    }
    
    
    
    

    /*当你输入信用卡号码的时候，有没有担心输错了而造成损失呢？其实可以不必这么担心，
    因为并不是一个随便的信用卡号码都是合法的，它必须通过Luhn算法来验证通过。
    该校验的过程：
            1、从卡号最后一位数字开始，逆向将奇数位(1、3、5等等)相加。
            2、从卡号最后一位数字开始，逆向将偶数位数字，先乘以2（如果乘积为两位数，则将其减去9），再求和。
            3、将奇数位总和加上偶数位总和，结果应该可以被10整除。
    例如，卡号是：5432123456788881
    则奇数、偶数位（用红色标出）分布：5432123456788881
    奇数位和=35
    偶数位乘以2（有些要减去9）的结果：1 6 2 6 1 5 7 7，求和=35
    最后35+35=70 可以被10整除，认定校验通过*/

    /**
     * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
     * @param nonCheckCodeCardId
     * @return
     */
    public int getBankCardCode(String nonCheckCodeCardId){  
/*            if(nonCheckCodeCardId != null || nonCheckCodeCardId.trim().length() != 0  
                || !nonCheckCodeCardId.matches("\\d+")) {  
            //如果传的不是数据返回N
            return '0';  
        }  */
        char[] chs = nonCheckCodeCardId.trim().toCharArray();  
        int luhmSum = 0;  
        for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {  
            int k = chs[i] - '0';  
            if(j % 2 == 0) {  
                k *= 2;  
                k = k / 10 + k % 10;  
            }  
            luhmSum += k;             
        }  
        return luhmSum ;  
    }

    /**
     * 前18位银行卡号换算的和（luhmSum）+最后一位数据lastnum，能被10整除
     * @param
     * @return
     */  
    public String getlast(int luhmSum){
    	
    	 if (luhmSum <= 0) {
             return null;
         }

         if (luhmSum % 10 == 0) {
             return "0";
         }
         
         return String.valueOf(10 - (luhmSum % 10));

    }
    
    
    
    
	
}
